home *** CD-ROM | disk | FTP | other *** search
- {
- Dv> CC> i know there is a way to load overlays into ems, but how do you
- Dv> CC> load 'em into xms?
-
- Dv> As far as I know it isn't possible with the standard overlay
- Dv>manager. But if you get any reactions on this I would certainly love
- Dv>to hear about them...
-
- Oops, I got this message second-hand... but there is a file called
- OVERXMS.ZIP that will do it. I'll send it to you (WARNING: it'll come
- split up in several shorter messages)
-
- [OVERXMS.PAS]
-
- { OVERXMS - Loads overlays in XMS. Written by Wilbert van Leijen }
-
- Unit OverXMS;
-
- {$O- }
-
- Interface
- uses Overlay;
-
- Const
- ovrNoXMSDriver = -7; { No XMS driver installed }
- ovrNoXMSMemory = -8; { Insufficient XMS memory
- available }
-
- Procedure OvrInitXMS;
-
- Implementation
-
- Procedure OvrInitXMS; External;
- {$L OVERXMS.OBJ }
-
- end. { OverXMS }
-
- [OVERXMS.ASM]
- TITLE Turbo Pascal XMS support for loading overlays - By Wilbert van Leijen
- PAGE 65, 132
- LOCALS @@
-
- Data SEGMENT Word Public
- ASSUME DS:Data
-
- ; XMS block move record
-
- XmsMoveType STRUC
- BlkSize DD ?
- SrcHandle DW ?
- SrcOffset DD ?
- DestHandle DW ?
- DestOffset DD ?
- XmsMoveType ENDS
-
- ; TP overlay manager record
-
- OvrHeader STRUC
- ReturnAddr DD ? ; Virtual return address
- FileOfs DD ? ; Offset into overlay file
- CodeSize DW ? ; Size of overlay
- FixupSize DW ? ; Size of fixup table
- EntryPts DW ? ; Number of procedures
- CodeListNext DW ? ; Segment of next overlay
- LoadSeg DW ? ; Start segment in memory
- Reprieved DW ? ; Loaded in memory flag
- LoadListNext DW ? ; Segment of next in load list
- XmsOffset DD ? ; Offset into allocated XMS block
- UserData DW 3 DUP(?)
- OvrHeader ENDS
-
- XmsDriver DD ? ; Entry point of XMS driver
- ExitSave DD ? ; Pointer to previous exit proc
- XmsMove XmsMoveType <>
- OvrXmsHandle DW ? ; Returned by XMS driver
-
- Extrn PrefixSeg : Word
- Extrn ExitProc : DWord
- Extrn OvrResult : Word
- Extrn OvrCodeList : Word
- Extrn OvrDosHandle : Word
- Extrn OvrHeapOrg : Word
- Extrn OvrReadBuf : DWord
- Data ENDS
-
- Code SEGMENT Byte Public
- ASSUME CS:Code
- Public OvrInitXMS
-
- ovrIOError EQU -4
- ovrNoXMSDriver EQU -7
- ovrNoXMSMemory EQU -8
-
- OvrXmsExit PROC
-
- ; Release handle and XMS memory
-
- MOV DX, [OvrXmsHandle]
- MOV AH, 10
- CALL [XmsDriver]
-
- ; Restore pointer to previous exit procedure
-
- LES AX, [ExitSave]
- MOV Word Ptr [ExitProc], AX
- MOV Word Ptr [ExitProc+2], ES
- RETF
- OvrXmsExit ENDP
-
- AllocateXms PROC
-
- ; Determine the size of the XMS block to allocate:
- ; Walk the CodeListNext chain
- ; Store the total codesize in DX:AX
-
- XOR AX, AX
- XOR DX, DX
- MOV BX, [OvrCodeList]
- @@1: ADD BX, [PrefixSeg]
- ADD BX, 10h
- MOV ES, BX
- ADD AX, ES:[OvrHeader.CodeSize]
- ADC DX, 0
- MOV BX, ES:[OvrHeader.CodeListNext]
- OR BX, BX
- JNZ @@1
-
- ; Obtain number of kilobytes to allocate
-
- MOV BX, 1024
- DIV BX
- XCHG DX, AX
- INC DX
-
- ; Allocate the block
-
- MOV AH, 9
- CALL [XmsDriver]
- OR AX, AX
- JZ @@2
- MOV [OvrXmsHandle], DX
- @@2: RETN
- AllocateXms ENDP
-
- ; Function XmsReadFunc(OvrSeg : Word) : Integer; Far;
-
- XmsReadFunc PROC
-
- ; Swap the code from XMS to the heap
-
- PUSH BP
- MOV BP, SP
- MOV ES, [BP+6]
- MOV AX, ES:[OvrHeader.CodeSize]
- MOV Word Ptr [XmsMove.BlkSize], AX
- XOR AX, AX
- MOV Word Ptr [XmsMove.BlkSize+2], AX
- MOV AX, [OvrXmsHandle]
- MOV [XmsMove.SrcHandle], AX
- MOV AX, Word Ptr ES:[OvrHeader.XmsOffset]
- MOV Word Ptr [XmsMove.SrcOffset], AX
- MOV AX, Word Ptr ES:[OvrHeader.XmsOffset+2]
- MOV Word Ptr [XmsMove.SrcOffset+2], AX
- XOR AX, AX
- MOV [XmsMove.DestHandle], AX
- MOV Word Ptr [XmsMove.DestOffset], AX
- MOV AX, ES:[OvrHeader.LoadSeg]
- MOV Word Ptr [XmsMove.DestOffset+2], AX
- MOV AH, 11
- LEA SI, XmsMove
- CALL [XmsDriver]
- OR AX, AX
- JZ @@1
- DEC AX
- JMP @@2
-
- @@1: MOV AX, ovrIOError
- @@2: POP BP
- RETF 2
- XmsReadFunc ENDP
-
- ; Copy an overlaid unit from the heap to XMS
- ; If successful, carry flag is cleared
- ; In/Out:
- ; BX:DI = offset into XMS memory block
-
- CopyUnitToXms PROC
-
- ; XMS requires that an even number of bytes is moved
-
- MOV DX, ES:[OvrHeader.CodeSize]
- TEST DX, 1
- JZ @@1
- INC DX
- INC ES:[OvrHeader.CodeSize]
-
- ; Get the fields of the XMS block move structure
-
- @@1: MOV Word Ptr [XmsMove.BlkSize], DX
- XOR AX, AX
- MOV Word Ptr [XmsMove.BlkSize+2], AX
- MOV [XmsMove.SrcHandle], AX
- MOV Word Ptr [XmsMove.SrcOffset], AX
- MOV AX, [OvrHeapOrg]
- MOV Word Ptr [XmsMove.SrcOffset+2], AX
- MOV AX, [OvrXmsHandle]
- MOV [XmsMove.DestHandle], AX
- MOV Word Ptr [XmsMove.DestOffset], DI
- MOV Word Ptr [XmsMove.DestOffset+2], BX
- MOV AH, 11
- LEA SI, XmsMove
- CALL [XmsDriver]
-
- ; Bump code size
-
- ADD DI, DX
- ADC BX, 0
-
- ; Check return code from XMS driver
-
- OR AX, AX
- JZ @@2
- CLC
- RETN
-
- @@2: STC
- RETN
- CopyUnitToXms ENDP
-
- OvrXmsLoad PROC
- PUSH BP
- MOV BP, SP
-
- ; Walk the CodeList chain
- ; First segment is PrefixSeg+10h+OvrCodeList
- ; Push each element of overlaid unit list on the stack
- ; Keep the size of the linked list in CX
-
- MOV AX, [OvrCodeList]
- XOR CX, CX
- @@1: ADD AX, [PrefixSeg]
- ADD AX, 10h
- MOV ES, AX
- PUSH AX
- INC CX
- MOV AX, ES:[OvrHeader.CodeListNext]
- OR AX, AX
- JNZ @@1
-
- ; Loop:
- ; Pop each element of the overlaid unit list from the stack
-
- XOR BX, BX
- XOR DI, DI
- @@2: POP ES
- PUSH CX
- MOV AX, [OvrHeapOrg]
- MOV ES:[OvrHeader.LoadSeg], AX
- MOV Word Ptr ES:[OvrHeader.XmsOffset+2], BX
- MOV Word Ptr ES:[OvrHeader.XmsOffset], DI
-
- ; Load overlay from disk
-
- PUSH BX
- PUSH DI
- PUSH ES
- PUSH ES
- CALL [OvrReadBuf]
- POP ES
- POP DI
- POP BX
-
- ; Flag unit as 'unloaded'; check return code
-
- MOV ES:[OvrHeader.LoadSeg], 0
- NEG AX
- JC @@3
-
- CALL CopyUnitToXms
- JC @@3
-
- POP CX
- LOOP @@2
-
- @@3: MOV SP, BP
- POP BP
- RETN
- OvrXMSLoad ENDP
-
- OvrInitXMS PROC
-
- ; Make sure the file's been opened
-
- XOR AX, AX
- CMP AX, [OvrDOSHandle]
- JNE @@1
- DEC AX ; ovrError
- JMP @@5
-
- ; Check presence of XMS driver
-
- @@1: MOV AX, 4300h
- INT 2Fh
- CMP AL, 80h
- JE @@2
- MOV AX, ovrNoXmsDriver
- JMP @@5
-
- ; Get XMS driver's entry point
-
- @@2: MOV AX, 4310h
- INT 2Fh
- MOV Word Ptr [XmsDriver], BX
- MOV Word Ptr [XmsDriver+2], ES
- CALL AllocateXms
- JNZ @@3
- MOV AX, ovrNoXMSMemory
- JMP @@5
-
- ; Load the overlay into XMS
-
- @@3: CALL OvrXmsLoad
- JNC @@4
-
- ; An error occurred. Release handle and XMS memory
-
- MOV DX, [OvrXmsHandle]
- MOV AH, 10
- CALL [XmsDriver]
- MOV AX, ovrIOError
- JMP @@5
-
- ; Close file
-
- @@4: MOV BX, [OvrDOSHandle]
- MOV AH, 3Eh
- INT 21h
-
- ; OvrReadBuf := XmsReadFunc
-
- MOV Word Ptr [OvrReadBuf], Offset XmsReadFunc
- MOV Word Ptr [OvrReadBuf+2], CS
-
- ; ExitSave := ExitProc
- ; ExitProc := OvrXmsExit
-
- LES AX, [ExitProc]
- MOV Word Ptr [ExitSave], AX
- MOV Word Ptr [ExitSave+2], ES
- MOV Word Ptr [ExitProc], Offset OvrXmsExit
- MOV Word Ptr [ExitProc+2], CS
-
- ; Return result of initialisation
-
- XOR AX, AX
- @@5: MOV [OvrResult], AX
- RETF
- OvrInitXMS ENDP
-
- Code ENDS
- END
-
- {------------------ XX3402 Code
- Cut out, and use XX3402 to Decode : Save file as OVERXMS.XX
-
- Execute XX3402 d overxms.xx
-
- *XX3402-000913-210296--72--85-09820-----OVERXMS.OBJ--1-OF--1
- U+o+0qxqNL7sPLAiEJBBFMUU++++53FpQa7j623nQqJhMalZQW+UJaJmQqZjPW+n9X8NW-A+
- ECb7c3IU0qxqNL7sPLAiEJBBA6U1+21dH7M0++-cW+A+E84IZUM+-2F-J234a+Q+G-c++U2-
- ytM4++F1HoF3FNU5+0Wi+EA-+MKAJ++7I373FYZMIoJ5++V3K2ZII37DEk+7HpNGIYJHJIlI
- ++hDJZ71HoF3H2ZHJ++AHpNGF2xHG23CF2l3++dDJZ76FI3EHp75++dDJZ7GFI32EZJ4+0OE
- 2E+++UdDJZ77HYZIK2pHCE2+xcU2+20W+N4UgU20++093VU+h+fz5U++l+M2+8A++6k4+U19
- Aw+nocgS+++15U++UwAEXgAa+kM6+6DG+0O95Us+0xhptfg+-DTnYY8o0TwS+++9k5E2WFMM
- +ABJWymCFUMacEU+ckU+Aw0X0U0V4+0X1++acFM+cks+7e2M+8AE+1D+cl6+clE+7e2E+8AK
- +9E9jUU+zls+++j+R+F6ukGEiDnzLQc0+0O93UU+xw6-+5E4EWPz-UU+WFM6+1D+ckc+ckk+
- cks+cE++cl++cFU+cl6+WHsI+6YS3U0o0vs6+DwS+++1ycDH++j+R+9skzb1JMjgcE++AwY1
- -U++-F++Xg-EEGOV1U+9k5LhAxgnzkRFcE++7eAE+0O75VU+7cYy3U-HJkM4zls+++RTKmP5
- -V++++1rq566u4jzQUBNsgy9tJr1Aw+v-U++REF6uqOEi+-1nGwwU5E4iDbzupSEi--1nGy7
- 5U++X+M0+CWmzbI4iDXzunyEu5PzQl093VU+h+fz5U++iDnzumeEWls++9EynG55-U++HU0A
- 1U6+l+M++8A2+6k4-U15-U++++0A1U6+Aw0X++19RdnW+AE0J+5203E-l+lI+QED-U20l-A4
- +E925+M--AEU-U2-l2BI+QF9J+52KJE-l3tI+QFVJ+52N3E-l4hI+QFmJ+52RpE-l5dI+QG-
- J+52VZE-l6dI+QGiJ+52gpE-l9NI+QGtJ+52j+M--gGzJ+52kZE-lAJI+QH7J+52nJE-lB7I
- +QHKJ+52uEM--AHj-U2-lEQ4+EP35EM--wIx-U23lJhI+QJTJ+53QpE-lLZI+QK1-U23lMg4
- +ET3XJE0lN24+ET3ZEM-+gKMJ+53b3E-lO+4+E93cZE0lOM4+E93ekM-+z88+U++R+++
- ***** END OF BLOCK 1 *****
-